#include <stdio.h>
#include <stdlib.h>


typedef struct Link{
	char elem;
	struct Link* next;
} link;

// 初始化链表
link *init_link(); 

//链表插入元素
link * insert_link_list(link* p,int elem,int index); 

// 根据位置删除链表中的元素
link* del_link_list_elem(link* p,int index); 

// 链表查找元素，返回下标
int select_elem_index(link* p,int elem); 

// 根据位置更新链表元素
link* update_elem(link* p,int index,int new_elem);

//输出链表
void display_link_list(link* p);

int main()
{
	//...
	return 0;
} 

link *init_link()
{
	link* p=NULL;	//创建头指针 
	link* temp=(link* )malloc(sizeof(link));	//创建头节点
	//头节点初始化
	temp->elem=1;
	temp->next=NULL;
	p->next=temp; 
	
	//创建结点并初始化
	for(int i=1;i<5;i++)
	{
		link* a=(link* )malloc(sizeof(link));
		a->elem=i;
		a->next=NULL;
		
		temp->next=a;
		temp=temp->next;
	} 
	
	//返回头节点 
	return p;
}

void display_link_list(link* p)
{
	link* temp=p;
	while(temp!=NULL)
	{
		printf("%d\n",temp->elem);
		temp=temp->next;
	}
	printf("\n");
}

link * insert_link_list(link* p,int elem,int index)
{
	link* temp=p;
	//找到要插入的上一个结点的位置
	for(int i=1;i<index;i++)
	{
		temp=temp->next;
		if(temp==NULL)
		{
			printf("插入的位置无效\n");
			return p;
		}
	} 
	
	//创建插入节点C
	link* insert_node=(link* )malloc(sizeof(link));
	insert_node->next=temp->next;
	temp->next=insert_node;
	return p;
}

link* del_link_list_elem(link* p,int index)
{
	link* temp=p;
	//遍历到被删除节点的上一个结点
	for(int i=1;i<index;i++)
	{
		temp=temp->next;
		if(temp==NULL)
		{
			printf("删除的结点不合法");
			return p;
		}
		
	} 
	
	// 将要删除的结点单独使用一个变量保存
	link* del_node=temp->next;
	//把要删除的结点的前一个next指向指向到要删除结点next指向的元素 
	temp->next=temp->next->next;	 
	//释放要删除的结点
	free(del_node);
	return p;
}

int select_elem_index(link* p,int elem)
{
	link* temp=p;
	int index=1;
	while(temp!=NULL)
	{
		if(temp->elem==elem)
		{
			return index;
		}
		index++;
	} 
	//查找失败返回-1 
	return -1;
}

link* update_elem(link* p,int index,int new_elem)
{
	link* temp=p;
	temp=temp->next;
	//遍历到待更新结点上
	for(int i=1;i<index;i++)
	{
		temp=temp->next;
	} 
	
	temp->elem=new_elem;
	return p;
}
